package n4_线程安全;

import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * ------------------------------------------
 *                                          /
 *    private 和 final一定程度可以保护线程安全  /
 *                                          /
 * ==========================================
 * public类 调用 两个类方法 判断 是否安全 【
 *                                       1. 在 类T1_thread_unsafe基础上 添加 ThredSafe 的子类并引用；
 *                                       2. 将ThredSafe 的方法改为公有
 *                                     】
 *
 * 引申：私有private方法修饰符在 一定程度上可以 保护线程安全
 *      也可以将 公共方法加final防止子类重写
 */
@Slf4j(topic = "c.T2")
public class T2_thread_unsafe {

    static final int THREAD_NUMBER = 2;
    static final int LOOP_NUMBER = 20;
    public static void main(String[] args) {
//>>>>>>>>>>>>>>>>>>>>>HEAD
//        ThredSafe test = new ThredSafe();
//-------------------------
        ThredSafe test = new ThreadSafeSubClass();
//<<<<<<<<<<<<<<<<<<<<<<<<<

        // 循环遍历 产生多个线程
        for (int i = 0; i < THREAD_NUMBER; i++) {

            new Thread(() -> {
                test.method1(LOOP_NUMBER);
            }, "Thread" + i).start();
        }
    }
}

/**
 * 多个线程 没有 [共享资源]    【list变量在 method1()方法里面】
 */
@Slf4j(topic = "c.ThredSafe")
class ThredSafe {
    public final void method1(int loopNumber) {

        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < loopNumber; i++) {

            // { 临界区, 会产生竞态条件
            method2(list);
            method3(list);

            // } 临界区
        }
    }
    public void method2(List list) {

        log.debug("++++++++++++++++++++++");
        list.add("1");
    }
    public void method3(List list) {

        log.debug("----------------------");
        list.remove(0);
    }
}
@Slf4j(topic = "c.ThreadSafeSubClass")
class ThreadSafeSubClass extends ThredSafe{
    @Override
    public void method3(List list) {
        new Thread(() -> {
            log.debug("------------");
            list.remove(0);
        }).start();
    }
}




